package main

import (
	"fmt"

	"gitee.com/minph/fileScript/common"
	"gitee.com/minph/fileScript/core"
	"github.com/minph/fs"
	"github.com/minph/fs/utils"
)

// FormatOption 格式化配置
type FormatOption struct {
	file string
	tab  int
}

// FormatFile --format file 对应命令
func FormatFile(c *Config, option *FormatOption) {

	if !utils.Exist(c.File) {
		errorType := "Error@FileScript.FormatFile.Unwrap[FILE_NOT_FOUND]"
		common.PrintErrorAndExit(errorType, fmt.Sprintf("文件路径[%v]不正确", c.File))

	}

	content, err := fs.ReadLines(c.File)

	if err != nil {
		errorType := "Error@FileScript.RunFile.Unwrap[FILE_CANNOT_READ]"
		common.PrintErrorAndExit(errorType, fmt.Sprintf("读取文件[%v]内容失败", c.File))

	}

	code := core.CompressCode(content)
	standardCode := core.Standardize(code.CheckCode())

	trees := core.GenerateTrees(standardCode)                   // 解析语法树
	formattedCode := standardCode.FormatCode(trees, option.tab) // 格式化

	if len(option.file) == 0 {
		option.file = c.File
		common.PrintError("警告", "没有设置输出文件路径，原文件将被覆盖")
	} else {
		common.PrintError("提示", fmt.Sprintf("格式化后代码将写入文件%v中", option.file))
	}

	// 写入文件
	file := fs.New(option.file).Create().Clear()
	for _, row := range formattedCode {
		file.Append(row + "\n")
	}

	fmt.Printf("文件[%v]标准格式化完成\n使用缩进长度 = %v", option.file, option.tab)
}
